{
  "rules": {
    "validators": {
      "dochub": {
        "title": "DocHub"
      },
      "dochub.metamodel": {
        "title": "Контроль ядра метамодели"
      },
      "dochub.metamodel.contexts": {
        "title": "Контроль целостности контекстов"
      },
      "dochub.metamodel.contexts.no_found_component": {
        "title": "Несуществующие компоненты",
        "source": "([(  \n  $MANIFEST := $;\n  contexts.$spread().(                      \n    $CONTEXT_ID := $keys()[0];\n    *.components.\n      {                   \n        \"contextID\": $CONTEXT_ID,\n        \"componentID\": $\n      };\n  )[$ and $not($substring(componentID, -2) = \".*\") and $not($exists($lookup($MANIFEST.components, componentID)))]\n).{\n    \"uid\": \"$dh-mm-nfc-\" & contextID & \"-\" & componentID,\n    \"correction\": \"Определите компонент или удалите ссылку на него в контексте\",\n    \"description\": \"Возможно компонент [\" & componentID & \"] не описан или описан в подключаемой \n    кодовой базе архитектуры, которая сейчас недоступна.\",\n    \"location\": \"/architect/contexts/\" & contextID\n}])\n"
      },
      "dochub.metamodel.contexts.outof": {
        "title": "Компоненты вне контекста",
        "source": "(\n  $MANIFEST := $;\n  $USED := $distinct(contexts.*.components);\n  [components.$spread().(\n      $ID := $keys()[0];\n      {\n          \"id\" : $ID,\n          \"mask\" : $USED[$wcard($ID, $)]\n      }\n  )[$not($exists(mask))].{\n    \"uid\": \"$dh-mm-ofb-\" & id,\n    \"correction\": \"Добавьте компонент в контекст\",\n    \"description\": \"Предполагается, что компонент не включенный в контекст не учтен.\",\n    \"location\": \"/architect/components/\" & id\n  }]\n)\n"
      },
      "dochub.metamodel.components": {
        "title": "Контроль целостности компонентов"
      },
      "dochub.metamodel.components.no_found_aspect": {
        "title": "Аспект не определен",
        "source": "([(  \n  $MANIFEST := $;\n  components.$spread().(                      \n    $COMPONENT_ID := $keys()[0];\n    *.aspects.\n      {                   \n        \"componentID\": $COMPONENT_ID,\n        \"aspectID\": $\n      };\n  )[$ and $not($exists($lookup($MANIFEST.aspects, aspectID)))]\n).{\n    \"uid\": \"$dh-mm-nfa-\" & contextID & \"-\" & componentID,\n    \"correction\": \"Определите аспект или удалите ссылку на него\",\n    \"description\": \"Возможно аспект [\" & aspectID & \"] не описан или описан в подключаемой \n    кодовой базе архитектуры, которая сейчас недоступна.\",\n    \"location\": \"/architect/spects/\" & aspectID\n}])\n"
      },
      "dochub.metamodel.components.no_define_parent": {
        "title": "Компонент верхнего уровня не определен",
        "source": "(\n    $ens := function($id) {\n        (\n            $ids := $split($id, \".\");\n            $join($map($ids, function($v, $i, $a) {\n                    $i < $count($ids) - 1 ? $v : undefined\n            }), \".\")\n        )\n    };\n\n    $MANIFEST := $;\n\n    [[$distinct(components.$spread().(\n        $ens($keys()[0])\n    ))[$not($exists($lookup($MANIFEST.components, $)))]].{\n        \"uid\": \"$dh-mm-cmp-ndp-\" & $,\n        \"correction\": \"Опишите компонент с идентификатором [\" & $ & \"]\",\n        \"description\": \"Предполагается, что для всех уровней компоненты определены.\"\n    }]\n)\n"
      },
      "dochub.metamodel.components.links": {
        "title": "Связь компонентов"
      },
      "dochub.metamodel.components.links.nofound": {
        "title": "Связь с несуществующими компонентами",
        "source": "(\n    $MANIFEST := $;\n    [[components.$spread().(\n        $ID := $keys()[0];\n        $.*.links.{\n            \"ownerID\": $ID,\n            \"linkID\": id\n        }\n    )[$ and $not($exists($lookup($MANIFEST.components, linkID)))]].{\n        \"uid\": \"$dh-mm-cmp-lnk-nf-\" & ownerID & \"-\" & linkID,\n        \"correction\": \"Определите компонент [\" & linkID & \"] или удалите ссылку на него\",\n        \"description\": \"Возможно компонент [\" & linkID & \"] не описан или описан в подключаемой \n        кодовой базе архитектуры, которая сейчас недоступна.\",\n        \"location\": \"/architect/components/\" & ownerID\n    }]\n)\n"
      },
      "dochub.metamodel.aspects": {
        "title": "Контроль целостности аспектов"
      },
      "dochub.metamodel.aspects.no_define_parent": {
        "title": "Аспект верхнего уровня не определен",
        "source": "(\n    $ens := function($id) {\n        (\n            $ids := $split($id, \".\");\n            $join($map($ids, function($v, $i, $a) {\n                    $i < $count($ids) - 1 ? $v : undefined\n            }), \".\")\n        )\n    };\n\n    $MANIFEST := $;\n\n    [[$distinct(aspects.$spread().(\n        $ens($keys()[0])\n    ))[$not($exists($lookup($MANIFEST.aspects, $)))]].{\n        \"uid\": \"$dh-mm-apt-ndp-\" & $,\n        \"correction\": \"Опишите аспект с идентификатором [\" & $ & \"]\",\n        \"description\": \"Предполагается, что для всех уровней аспекты определены.\"\n    }]\n)\n"
      },
      "dochub.fields": {
        "title": "Заполнение полей"
      },
      "dochub.fields.experts": {
        "title": "Не указаны эксперты для компонентов",
        "source": "([([\n  components.$spread().(                                                /* Сканируем все компоненты */\n    $ID := $keys()[0];\n      {                                                                 /* Генерируем массив признаков проблем */\n        \"isComponent\": *.entity = \"component\",                          /* Это компонент */\n        \"isDocHubL1Domain\": $boolean($match($ID, /dochub\\.[^\\.]*$/)),   /* в домене DocHub L1 */\n        \"isExpertEmpty\":  $not($boolean(\"\" & *.expert)),                /* и поле expert не заполнено */\n        \"id\": $ID\n      }\n  )        \n][isDocHubL1Domain and isExpertEmpty and isComponent]).{ /* Отбираем все компоненты где поле 'expert' пустое*/\n    \"uid\": \"expert-component-\" & id,                                    /* Уникальный идентификатор выявленной ошибки */\n    \"location\": \"/architect/components/\" & id,                          /* Ссылка на расположение объекта ошибки */\n    \"correction\": \"Укажите эксперта по компоненту\",                     /* Рекомендации как исправить проблему */\n    \"description\": \"Компоненты L1 должны иметь сведения об экспертах.\"\n}])\n"
      },
      "dochub.fields.source": {
        "title": "Не указан файл исходного кода",
        "schema": {
          "type": "object",
          "properties": {
            "source": {
              "type": "string"
            }
          },
          "required": [
            "source"
          ],
          "additionalProperties": true
        },
        "source": "(\n  /* Создаем валидатор JSON schema */\n  $validator := $jsonschema($self.schema);  /* Схему валидата получаем из контекста отклонения*/\n  /* Формируем базу для проверки */\n  ([([\n    components.$spread().( /* Сканируем все компоненты */\n      $ID := $keys()[0];\n      {\t\t\t\t\t\t\t\t\t\t\t\t\t\t                                    /* Генерируем массив признаков проблем */\n        \"isComponent\": *.entity = \"component\",\t\t\t\t\t\t            /* Это компонент */\n        \"isDocHubDomain\": $boolean($match($ID, /dochub\\.front.*/)),\t  /* в домене DocHub */\n        \"id\": $ID,\t\t\t\t\t\t\t\t\t\t\t\t                            /* Запоминаем идентификатор компонента */\n        \"isvalid\": $validator($.*)\t\t\t\t\t\t\t\t\t                  /* Валидируем компонент по схеме */\t\t\t\t\t\t\t\t\t\n      }\n    )        \n  ][isDocHubDomain and isComponent and isvalid != true]).isvalid.{  /* Генерируем отклонения по выявленным нарушениям */\n    \"uid\": $.params.missingProperty & \"-component-\" & %.id,\t\t\t\t  /* Уникальный идентификатор выявленной ошибки */\n    \"location\": \"/architect/components/\" & %.id,\t\t\t\t\t\t        /* Ссылка на расположение объекта ошибки */\n    \"correction\": \"Заполните необходимые поля\",\t\t\t\t\t\t          /* Рекомендации как исправить проблему */\n    \"description\": message\n  }])\n)\n"
      }
    },
    "exceptions": {
      "source-component-dochub.front.spa.blank.doc.markdown": {
        "reason": "Пример исключения для указания исходных кодов\n",
        "cause": "/docs/dochub.exceptions.examples.doc_markdown"
      },
      "$dh-mm-ofb-dochub": {
        "reason": "Корневой компонент может не входить в контекст"
      }
    }
  },
  "entities": {
    "entities": {
      "schema": {
        "type": "object",
        "additionalProperties": false,
        "patternProperties": {
          "^[a-zA-Z0-9_]*(\\.[a-zA-Z0-9_]*)*$": {
            "title": "Идентификатор сущности",
            "type": "object",
            "properies": {
              "presentations": {
                "type": "object",
                "additionalProperties": false,
                "patternProperties": {
                  "^[a-zA-Z0-9_]*$": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "type": {
                            "type": "$doctypes"
                          },
                          "template": {
                            "type": "$file"
                          },
                          "source": {
                            "type": "$jsonata"
                          }
                        },
                        "required": [
                          "type",
                          "template",
                          "source"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "type": {
                            "type": "$doctypes"
                          },
                          "source": {
                            "type": "$file"
                          }
                        },
                        "required": [
                          "type",
                          "source"
                        ]
                      }
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "interactions": {
      "title": "Взаимодействия",
      "description": "Взаимодействия между компонентами\n",
      "menu": "(\n  $interactions := $.interactions;\n  $makeLocation := function($id) {(\n      $arrleft := function($arr ,$count) {\n          $map($arr, function($v, $i) {\n          $i <= $count ? $v\n          })\n      };\n      $domains := $split($id, \".\");\n      \"Взаимодействия/\" & $join($map($domains, function($domain, $index) {(\n          $lookup($interactions, $join($arrleft($domains, $index), \".\")).title\n      )}), \"/\");\n  )};\n  $append([{\n      \"icon\": *.icon,                                                 /* Получаем иконку */\n      \"link\": \"/entities/interactions/tree\",                           /* Ссылка на форму представления tree (дерево дерево объектов \"interactions\") */\n      \"location\": \"Взаимодействия\"                                    /* Расположение в меню */\n  }\n  ],\n      [$.interactions.$spread().{\n          \"icon\": *.icon,                                             /* Получаем иконку */\n          \"link\": \"/entities/interactions/blank?id=\" & $keys()[0],     /* Формируем ссылку на бланк документ */\n          \"location\": $makeLocation($keys()[0])                       /* Формируем расположение в меню */\n      }][location]\n  );\n)\n",
      "presentations": {
        "tree": {
          "type": "plantuml",
          "template": "templates/tree.puml",
          "title": "Каталог взаимодействия",
          "params": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              }
            }
          },
          "source": "(\n    $set(\"rpev-id\", undefined);\n    $arrleft := function($arr ,$count) {\n        $map($arr, function($v, $i) {\n            $i <= $count ? $v\n        })\n    };\n    $interactions := $.interactions;\n    [$interactions.$spread().($merge([{\"id\" : $keys()[0]}, $.*]))^(id).(\n        $prev_nodes := $split($get(\"rpev-id\"), \".\");\n        $prev_level := $count($prev_nodes);\n        $curr_nodes := $split(id, \".\");\n        $set(\"isdiff\", false);\n        $result := $map($curr_nodes, function($v, $i) {(\n            $set(\"isdiff\", $get(\"isdiff\") or $prev_level = 0 or $prev_level <= $i or $v != $prev_nodes[$i]) ? (\n                $id := $join($arrleft($curr_nodes, $i), \".\");\n                $interaction :=  $lookup($interactions, $id);\n                {\n                    \"id\": $id,\n                    \"level\": $pad(\"\", $i + 2, \"*\"),\n                    \"title\": ($interaction ? $interaction.title : $id),\n                    \"link\": $id=$params.id ? undefined : \"/entities/interactions/blank?id=\" & $id\n                }\n            );\n        )});\n        $set(\"rpev-id\", id);\n        $result \n    )];\n)  \n"
        },
        "blank": {
          "type": "plantuml",
          "title": "Диаграмма взаимодействия",
          "template": "templates/blank.puml",
          "params": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              }
            },
            "required": [
              "id"
            ]
          },
          "source": "(\n    $lookup(interactions, $params.id)\n)\n"
        },
        "export": {
          "type": "upload",
          "mimetype": "application/xml",
          "title": "Экспорт в BPMN",
          "template": "templates/bpmn.xml",
          "params": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              }
            },
            "required": [
              "id"
            ]
          },
          "source": "(\n  $mul := 120;\n  $lookup(interactions, $params.id).(\n      $this := $;\n      $body := {\n          \"id\": $params.id,\n          \"start\": {\n              \"name\": $this.triggers[0],\n              \"stepid\": \"step0\",\n              \"outgoing\": \"flow0\",\n              \"shapey\": $mul,\n              \"labely\": $mul - 30\n          },\n          \"steps\": $this.steps ~> $map(function($v, $i) { \n              {\n                  \"name\": $v.value,\n                  \"stepid\": \"step\" & ($i+1),\n                  \"flowid\": \"flow\" & ($i),\n                  \"incoming\": \"flow\" & ($i),\n                  \"outgoing\": \"flow\" & ($i+1),\n                  \"sourceRef\": \"step\" & ($i),\n                  \"targetRef\": \"step\" & ($i+1),\n                  \"shapey\": ($i * $mul) + ($mul * 2),\n                  \"flowy\": ($i * $mul) + ($mul * 2) - ($i = 0 ? 84 : 40),\n                  \"flowdy\": ($i * $mul) + ($mul * 2)\n              }\n          })\n      };\n      $step_count := $count($body.steps);\n      $merge([$body, {\n          \"end\": {\n              \"name\": $this.results[0],\n              \"stepid\": \"step\" & ($step_count + 1),\n              \"flowid\": \"flow\" & ($step_count),\n              \"incoming\": \"flow\" & ($step_count),\n              \"sourceRef\": \"step\" & ($step_count),\n              \"targetRef\": \"step\" & ($step_count+1),\n              \"shapey\": $step_count * $mul + ($mul * 2) + 50,\n              \"labely\": $step_count * $mul - 30 + ($mul * 2) + 50,\n              \"flowy\": ($step_count * $mul) + ($mul * 2 - 40),\n              \"flowdy\": ($step_count * $mul) + ($mul * 2) + 54\n\n          }\n      }])\n  )\n)\n"
        }
      },
      "schema": {
        "type": "object",
        "patternProperties": {
          "[a-zA-Z0-9_]*(\\.[a-zA-Z0-9_]*)*$": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "properties": {
                "icon": {
                  "title": "Иконка",
                  "type": "string",
                  "minLength": 2
                },
                "title": {
                  "title": "Наименование",
                  "type": "string",
                  "minLength": 5
                },
                "triggers": {
                  "title": "События запускающие взаимодействие",
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "string",
                    "minLength": 5
                  }
                },
                "steps": {
                  "title": "Описание взаимодействия",
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "object",
                    "properties": {
                      "from": {
                        "title": "От кого",
                        "type": "string",
                        "minLength": 1
                      },
                      "to": {
                        "title": "Кому",
                        "type": "string",
                        "minLength": 1
                      },
                      "value": {
                        "title": "Что",
                        "type": "string",
                        "minLength": 1
                      }
                    },
                    "required": [
                      "from",
                      "to",
                      "value"
                    ]
                  }
                },
                "results": {
                  "title": "Результаты взаимодействия",
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "string",
                    "minLength": 5
                  }
                }
              },
              "required": [
                "title",
                "triggers",
                "results",
                "steps"
              ]
            }
          }
        }
      }
    },
    "components": {
      "presentations": {
        "blank": {
          "widgets": {
            "outside_links": {
              "title": "Кто зависит от этого компонента",
              "presentation": "outside_links",
              "params": {
                "param1": "Значение параметра 1",
                "param2": "Значение параметра 2"
              },
              "align": "<"
            }
          }
        },
        "outside_links": {
          "params": {
            "type": "object",
            "properties": {
              "component": {
                "title": "Идентификатор компонента",
                "type": "string"
              },
              "param1": {
                "title": "Обязательный параметр 1",
                "type": "string"
              }
            },
            "required": [
              "component"
            ]
          },
          "type": "table",
          "headers": [
            {
              "value": "id",
              "text": "Идентификатор",
              "sortable": true,
              "align": "left",
              "width": "40%",
              "link": "link"
            },
            {
              "value": "title",
              "text": "Наименование",
              "sortable": true,
              "align": "left",
              "width": "40%",
              "link": "link"
            },
            {
              "value": "direction",
              "text": "Направление связи",
              "sortable": true,
              "align": "center",
              "width": "20%"
            }
          ],
          "source": "(\n  [$distinct(components.$spread().(\n    $id := $keys()[0];\n    $title := *.title;\n    $links := $distinct($.*.links[id=$params.component].(\"\" & direction));\n    $links.{\n      \"id\": $id,\n      \"title\": $title,\n      \"direction\": $links,\n      \"link\": \"/architect/components/\" & $id\n    }\n  ))^(id)]\n)\t\n"
        }
      }
    },
    "aspects": {
      "presentations": {
        "blank": {
          "widgets": {
            "people": {
              "title": "Люди",
              "presentation": "people",
              "align": "<"
            }
          }
        },
        "people": {
          "params": {
            "type": "object",
            "properties": {
              "aspect": {
                "title": "Идентификатор аспекта",
                "type": "string"
              }
            },
            "required": [
              "aspect"
            ]
          },
          "type": "markdown",
          "template": "templates/people.md",
          "source": "(\n  $lookup(aspects, $params.aspect)\n)\t          \n"
        }
      }
    }
  },
  "imports": [
    "interactions/entity.yaml",
    "extentions/entity.yaml",
    "order.yaml",
    "payment.yaml",
    "context.yaml",
    "front.yaml",
    "plantuml.yaml",
    "user.yaml",
    "gitlab.yaml",
    "browser.yaml",
    "web.yaml",
    "examples/root.yaml",
    "components/root.yaml",
    "aspects.yaml",
    "contexts.yaml",
    "namespaces.yaml",
    "forms.yaml",
    "technologies.yaml",
    "rules.yaml",
    "examples/table.yaml",
    "rules/root.yaml",
    "plugins/root.yaml",
    "conception/root.yaml",
    "manual/root.yaml",
    "docs/root.yaml",
    "arch/root.yaml",
    "entities/root.yaml",
    "/documentation/root.yaml"
  ],
  "docs": {
    "dochub.welcome": {
      "type": "markdown",
      "source": "introduction.md"
    },
    "dochub.conception": {
      "location": "DocHub",
      "description": "Концепция",
      "type": "markdown",
      "source": "introduction.md"
    },
    "dochub.conception.introduction": {
      "description": "Введение",
      "type": "markdown",
      "source": "introduction.md"
    },
    "dochub.mindmap": {
      "description": "Карта памяти",
      "type": "PlantUML",
      "source": "mindmap.puml"
    },
    "dochub.archver": {
      "description": "Управление версиями",
      "type": "PlantUML",
      "source": "archver.puml"
    },
    "dochub.archdistrib": {
      "description": "Распределенная архитектура",
      "type": "PlantUML",
      "source": "archdistrib.puml"
    },
    "dochub.archeco": {
      "description": "Структура экосистем",
      "type": "PlantUML",
      "source": "archeco.puml"
    },
    "dochub.archeco.proc": {
      "description": "Управление архитектурой экосистем",
      "type": "PlantUML",
      "source": "archeco_proc.puml"
    },
    "dochub.facade": {
      "description": "Управление архитектурными фасадами",
      "type": "PlantUML",
      "source": "facade.puml"
    },
    "dochub.manual": {
      "location": "DocHub/Руководство",
      "description": "Руководство",
      "type": "markdown",
      "source": "introduction.md",
      "subjects": [
        "dochub",
        "dochub.front"
      ]
    },
    "dochub.introduction": {
      "location": "DocHub/Руководство/Введение",
      "description": "Введение",
      "type": "markdown",
      "subjects": [
        "dochub",
        "dochub.front"
      ],
      "source": "introduction.md"
    },
    "dochub.imports": {
      "location": "DocHub/Руководство/Импорт",
      "description": "Импорт манифестов",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa"
      ],
      "source": "imports.md"
    },
    "dochub.components": {
      "location": "DocHub/Руководство/Компоненты",
      "description": "Компоненты",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.component"
      ],
      "source": "components.md"
    },
    "dochub.contexts": {
      "location": "DocHub/Руководство/Контексты",
      "description": "Контексты",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.context"
      ],
      "source": "contexts.md"
    },
    "dochub.aspects": {
      "location": "DocHub/Руководство/Аспекты",
      "description": "Аспекты",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.aspect"
      ],
      "source": "aspects.md"
    },
    "dochub.forms": {
      "location": "DocHub/Руководство/Формы",
      "description": "Формы",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa"
      ],
      "source": "forms.md"
    },
    "dochub.technologies": {
      "location": "DocHub/Руководство/Технологии",
      "description": "Технологии",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa"
      ],
      "source": "technologies.md"
    },
    "dochub.radar": {
      "location": "DocHub/Руководство/Техрадар",
      "description": "Техрадар",
      "type": "markdown",
      "subjects": [
        "dochub.radar",
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.radar"
      ],
      "source": "radar.md"
    },
    "dochub.datasets": {
      "location": "DocHub/Руководство/Источники данных",
      "description": "Источники данных",
      "type": "markdown",
      "source": "datasets.md",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.dataset"
      ]
    },
    "dochub.inheritance": {
      "location": "DocHub/Руководство/Наследование",
      "description": "Наследование объектов",
      "type": "markdown",
      "source": "inheritance.md",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.dataset"
      ]
    },
    "dochub.jsonata": {
      "location": "DocHub/Руководство/JSONata+",
      "description": "Расширения JSONata",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.dataset"
      ],
      "source": "jsonata.md"
    },
    "dochub.entities": {
      "location": "DocHub/Руководство/Сущности",
      "description": "Расширения метамодели",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.dataset"
      ],
      "source": "entities/intro.md"
    },
    "dochub.entities.examples": {
      "location": "DocHub/Руководство/Сущности/Пример",
      "description": "Пример расширения метамодели",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.dataset"
      ],
      "source": "entities/entities.md"
    },
    "dochub.deployment": {
      "icon": "settings",
      "location": "DocHub/Развертывание",
      "description": "Развертывание",
      "type": "markdown",
      "subjects": [
        "dochub.front"
      ],
      "source": "config/deployment.md"
    },
    "dochub.context.source": {
      "type": "plantuml",
      "source": "context_source.puml"
    },
    "dochub.docs": {
      "location": "DocHub/Руководство/Документы",
      "description": "Документы",
      "autor": "R.Piontik",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "docs.md"
    },
    "dochub.markdown": {
      "location": "DocHub/Руководство/Документы/Markdown",
      "description": "Markdown",
      "autor": "R.Piontik",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "markdown.md"
    },
    "dochub.plantuml": {
      "location": "DocHub/Руководство/Документы/PlantUML",
      "description": "PlantUML",
      "autor": "R.Piontik",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "plantuml.md"
    },
    "dochub.mermaid": {
      "location": "DocHub/Руководство/Документы/Mermaid",
      "description": "Mermaid",
      "autor": "R.Piontik",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "mermaid.md"
    },
    "dochub.network": {
      "location": "DocHub/Руководство/Документы/Network",
      "description": "Network",
      "autor": "R.Piontik",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "network.md"
    },
    "dochub.asyncapi": {
      "location": "DocHub/Руководство/Документы/AsyncApi",
      "description": "Markdown",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "asyncapi.md"
    },
    "dochub.swagger": {
      "location": "DocHub/Руководство/Документы/Swagger",
      "description": "Swagger",
      "autor": "R.Piontik",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "swagger.md"
    },
    "dochub.tables": {
      "location": "DocHub/Руководство/Документы/Таблицы",
      "description": "Таблицы",
      "autor": "R.Piontik",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "tables.md"
    },
    "dochub.smartants": {
      "location": "DocHub/Руководство/Документы/SmartAnts",
      "description": "SmartAnts",
      "autor": "R.Piontik",
      "type": "markdown",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "smartants.md"
    },
    "dochub.smartants.examples.simple": {
      "location": "DocHub/Руководство/Документы/SmartAnts/01 Простой пример",
      "description": "Простой пример использования SmartAnts",
      "autor": "R.Piontik",
      "type": "smartants",
      "source": {
        "config": {
          "distance": 120,
          "trackWidth": 24
        },
        "nodes": {
          "system": {
            "title": "Система",
            "symbol": "system"
          },
          "user": {
            "title": "Пользователь",
            "symbol": "user"
          }
        },
        "links": [
          {
            "from": "user",
            "to": "system",
            "title": "Логин и пароль",
            "style": "->",
            "link": "/docs/dochub.plantuml"
          },
          {
            "from": "system",
            "to": "user",
            "title": "JWT токен",
            "style": "->",
            "link": "/docs/dochub.swagger"
          }
        ]
      }
    },
    "dochub.smartants.examples.domains": {
      "location": "DocHub/Руководство/Документы/SmartAnts/02 Домены",
      "description": "Пример диаграммы SmartAnts с доменами",
      "autor": "R.Piontik",
      "type": "smartants",
      "source": {
        "config": {
          "distance": 120,
          "trackWidth": 24
        },
        "nodes": {
          "inside": {
            "title": "Внутренняя среда"
          },
          "outside": {
            "title": "Внешняя среда"
          },
          "inside.system": {
            "title": "Система",
            "symbol": "system"
          },
          "outside.user": {
            "title": "Пользователь",
            "symbol": "user"
          }
        },
        "links": [
          {
            "from": "outside.user",
            "to": "inside.system",
            "title": "Логин и пароль",
            "style": "->"
          },
          {
            "from": "inside.system",
            "to": "outside.user",
            "title": "JWT токен",
            "style": "->"
          }
        ]
      }
    },
    "dochub.smartants.examples.complex": {
      "location": "DocHub/Руководство/Документы/SmartAnts/03 Сложная диаграмма",
      "description": "Сложная диаграмма SmartAnts",
      "autor": "R.Piontik",
      "type": "smartants",
      "source": "examples/sa-complex.yaml"
    },
    "dochub.smartants.examples.anim": {
      "location": "DocHub/Руководство/Документы/SmartAnts/04 Анимация",
      "description": "Анимированная диаграмма SmartAnts",
      "autor": "R.Piontik",
      "type": "smartants",
      "source": "examples/sa-anim.yaml"
    },
    "dochub.smartants.examples.custom-symbol": {
      "location": "DocHub/Руководство/Документы/SmartAnts/05 Собственные символы",
      "description": "Кастомные символы SmartAnts",
      "autor": "R.Piontik",
      "type": "smartants",
      "source": "examples/sa-symbol.yaml"
    },
    "dochub.smartants.examples.simple-query": {
      "location": "DocHub/Руководство/Документы/SmartAnts/06 Простой запрос к данным",
      "description": "Простой запрос к данным в SmartAnts",
      "autor": "R.Piontik",
      "type": "smartants",
      "source": "(\n  /* Определяем фильтр для компонентов архитектуры */\n  $matcher := /^[a-zA-Z]*\\.[a-zA-Z]*$/i;\n  /* Генерируем структуру для диаграммы */\n  {\n    /* Формируем ноды из компонентов */\n    \"nodes\": $merge(components.$spread().(\n      /* Получаем идентификатор компонента */\n      $id := $keys()[0];\n      /* Если идентификатор компонента удовлетворяет фильтру, создаем ноду */\n      $matcher($id) ? {\n          /* Отсекаем домен верхнего уровня для исключения отображения компонентов в иерархии */\n          $split($id, \".\")[1]: {\n              \"title\": *.title,\n              /* Преобразуем entity компонентов в понятные диаграмме символы actor -> user */\n              \"symbol\": *.entity = \"actor\" ? \"user\" : *.entity\n          }\n      }\n\n    ))\n  }\n)\n"
    },
    "dochub.smartants.examples.complex-query": {
      "location": "DocHub/Руководство/Документы/SmartAnts/07 Сложный запрос к данным",
      "description": "Сложный запрос к данным в SmartAnts",
      "autor": "R.Piontik",
      "type": "smartants",
      "source": "examples/sa-query.jsonata"
    },
    "dochub.example.pml": {
      "type": "PlantUML",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "examples/example.puml"
    },
    "dochub.example.mermaid": {
      "type": "Mermaid",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "examples/mermaid.mmd"
    },
    "dochub.example.network": {
      "type": "Network",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "(\n  $manifest := $;\n  /* Перебираем все компоненты */\n  $adges  := $distinct(components.$spread().(\n    $node_id := $keys()[0];\n    $node := $.*;\n    /* Определяем связи */\n    $node.links.{\n      \"from\": $node_id,\n      \"to\": id,\n      \"label\": title\n    }\n  ));\n  /* Выявляем ноды из связей */\n  $nodes := $distinct($append($adges.from, $adges.to)).(\n    $struct := $split($, \".\");\n    $group := $replace($, \".\" & $reverse($struct)[0], \"\");\n    {\n      \"id\": $,\n      \"label\": $lookup($manifest.components, $).title,\n      \"group\": $group,\n      \"level\": $count($struct),\n      /* Позиционируем ноду тем выше, чем выше слой */\n      \"y\": $count($struct) * 200\n    }\n  );\n  /* Добавляем ноды легенды */\n  $nodes := $append($nodes, (\n    /* Получаем максимальную точку позиции нод */\n    $height := $max($nodes.y);\n    $groups := $distinct($nodes.group)^($);\n    /* Вычисляем центр легенды */\n    $offset := -($height / 2);\n    /* Определяем шаг легенды */\n    $step := $height / $count($groups);\n    /* Строим легенду */\n    $map($groups, function($v, $i, $a) {\n      {\n        \"id\": \"legend-\" & $string($i),\n        \"x\": -600,\n        \"y\": $i * $step + $offset,\n        \"shape\": \"square\",\n        \"label\": $v,\n        \"group\": $v,\n        \"value\": 1,\n        \"fixed\": true,\n        \"physics\": false\n      }\n    })\n  ));\n  /* Выводим результат */\n  {\n    \"nodes\": $nodes, /* Массив нод */\n    \"edges\": $adges, /* Массив связей */\n    \"options\": {     /* Параметры сетевой диаграммы https://visjs.github.io/vis-network/docs/network/ */\n      \"clickToUse\": false /* Отключаем обязательный клик перед взаимодействем с пользователем */\n    }\n  }\n)\n"
    },
    "dochub.example.swgr": {
      "type": "OpenAPI",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "examples/example.yaml"
    },
    "dochub.example.asyncapi": {
      "type": "AsyncApi",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "source": "examples/asyncapi.yaml"
    },
    "dochub.templates": {
      "location": "DocHub/Руководство/Документы/Шаблоны",
      "description": "Шаблоны",
      "type": "markdown",
      "autor": "R.Piontik",
      "approvers": [
        "P.Petrov",
        "S.Sidorov",
        "N.Nikolaev"
      ],
      "source": "(\n  {\n    \"id\": $self._id,              /* Идентификатор документа */\n    \"autor\": $self.autor,         /* Автор документа */\n    \"approvers\": $self.approvers, /* Согласующие */\n    \"docs\": [docs.$spread().{     /* Другие документы автора */\n      \"id\": $keys()[0],\n      \"title\": *.description,\n      \"autor\": *.autor\n    }][autor=$self.autor]\n  }\n)\n",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "template": "templates.md"
    },
    "dochub.templates.pml": {
      "type": "PlantUML",
      "source": "(\n  {\n    \"entities\": $distinct([     /* Получаем все использованные сущности при описании архитектуры */ \n        components.*.entity\n    ])\n  }\n)\n",
      "subjects": [
        "dochub.front",
        "dochub.front.spa",
        "dochub.front.spa.blank",
        "dochub.front.spa.blank.doc"
      ],
      "template": "examples/template.puml"
    },
    "dochub.templates.asyncapi": {
      "type": "AsyncAPI",
      "source": "(\n  $BODY := $mergedeep([components.*.asyncapi]);\n  {\n      \"content\": [$BODY.$spread().{\n          \"field\": $keys()[0],\n          \"body\": $string($lookup($, $keys()[0]))\n      }]\n  }\n)\n",
      "template": "examples/asyncapi_template.json"
    },
    "dochub.templates.openapi": {
      "type": "OpenAPI",
      "source": "(\n  $BODY := $mergedeep([components.*.openapi]);\n  {\n      \"content\": [$BODY.$spread().{\n          \"field\": $keys()[0],\n          \"body\": $string($lookup($, $keys()[0]))\n      }]\n  }\n)\n",
      "template": "examples/openapi_template.json"
    },
    "dochub.table.preset": {
      "type": "table",
      "headers": [
        {
          "value": "id",
          "text": "Идентификатор",
          "sortable": true,
          "align": "left",
          "width": "20%"
        },
        {
          "value": "payload",
          "text": "Значение",
          "sortable": true,
          "align": "left"
        }
      ],
      "source": [
        {
          "id": 1,
          "payload": "Значение 1"
        },
        {
          "id": 2,
          "payload": "Значение 2"
        }
      ]
    },
    "dochub.table.select": {
      "type": "table",
      "headers": [
        {
          "value": "from",
          "text": "Система 1",
          "sortable": true,
          "align": "left",
          "width": "20%",
          "link": "link-from"
        },
        {
          "value": "to",
          "text": "Система 2",
          "sortable": true,
          "align": "left",
          "width": "20%",
          "link": "link-to"
        },
        {
          "value": "direction",
          "text": "Связь",
          "sortable": true,
          "align": "center",
          "width": "5%"
        },
        {
          "value": "title",
          "text": "Описание",
          "sortable": true,
          "align": "left"
        },
        {
          "value": "contract",
          "text": "Контракт",
          "sortable": true,
          "align": "left",
          "link": "link-contract"
        }
      ],
      "source": "(\n  $MANIFEST := $;\n  $distinct([components.$spread().(\n      $COMPONENT := $;\n      $COMPONENT_ID := $keys()[0];\n      $.*.links.{\n          \"from\": $COMPONENT.*.title,\n          \"link-from\": \"/architect/components/\" & $COMPONENT_ID,\n          \"to\": id ? $lookup($MANIFEST.components, id).title : id,\n          \"link-to\": \"/architect/components/\" & id,\n          \"contract\": contract ? $lookup($MANIFEST.docs, contract).location : contract,\n          \"link-contract\": \"/docs/\" & contract,\n          \"title\": title,\n          \"direction\": direction\n      };\n  )])^(from)\n)\n"
    },
    "dochub.table.ex_jsonata": {
      "type": "table",
      "headers": [
        {
          "value": "id",
          "text": "Идентификатор",
          "sortable": true,
          "align": "left",
          "width": "20%",
          "link": "link"
        },
        {
          "value": "title",
          "text": "Наименование",
          "sortable": true,
          "align": "left",
          "link": "link"
        }
      ],
      "source": "contexts.jsonata"
    },
    "dochub.table.ex_yaml": {
      "type": "table",
      "headers": [
        {
          "value": "name",
          "text": "ФИО автора",
          "sortable": true,
          "align": "left",
          "width": "100%"
        }
      ],
      "source": "autors.yaml"
    },
    "dochub.table.ex_http": {
      "type": "table",
      "headers": [
        {
          "value": "title",
          "text": "Name",
          "sortable": true,
          "align": "left"
        }
      ],
      "origin": "https://labs.ft.com/tech-radar/demo.json",
      "source": "showcases.jsonata"
    },
    "dochub.table.dataset": {
      "type": "table",
      "headers": [
        {
          "value": "location",
          "text": "Документ",
          "sortable": true,
          "align": "left",
          "width": "100%",
          "link": "link"
        }
      ],
      "source": "dochub.docs"
    },
    "dochub.table.dataset.post": {
      "type": "table",
      "headers": [
        {
          "value": "title",
          "text": "Документ",
          "sortable": true,
          "align": "left",
          "width": "100%",
          "link": "link"
        }
      ],
      "origin": "dochub.docs",
      "source": "(\n  $[$substring(location, 0, 29) = \"DocHub/Руководство/Документы/\"].{\n    \"title\": $substring(location, 29),\n    \"link\": link\n  }\n)\n"
    },
    "dochub.dataset.preset": {
      "type": "table",
      "headers": [
        {
          "value": "title",
          "text": "Класс критичности",
          "sortable": true,
          "align": "left",
          "width": "100%"
        }
      ],
      "source": "dochub.components.criticality"
    },
    "dochub.dataset.li": {
      "type": "table",
      "headers": [
        {
          "value": "location",
          "text": "Компонент L1",
          "sortable": true,
          "align": "left",
          "width": "100%",
          "link": "link"
        }
      ],
      "source": "dochub.components.l1"
    },
    "dochub.table.integrations": {
      "type": "table",
      "headers": [
        {
          "value": "from",
          "text": "Система 1",
          "sortable": true,
          "align": "left",
          "width": "20%",
          "link": "link-from"
        },
        {
          "value": "to",
          "text": "Система 2",
          "sortable": true,
          "align": "left",
          "width": "20%",
          "link": "link-to"
        },
        {
          "value": "direction",
          "text": "Связь",
          "sortable": true,
          "align": "center",
          "width": "5%"
        },
        {
          "value": "title",
          "text": "Описание",
          "sortable": true,
          "align": "left"
        },
        {
          "value": "contract",
          "text": "Контракт",
          "sortable": true,
          "align": "left",
          "link": "link-contract"
        }
      ]
    },
    "dochub.table.integrations.vuex": {
      "type": "table",
      "headers": [
        {
          "value": "from",
          "text": "Система 1",
          "sortable": true,
          "align": "left",
          "width": "20%",
          "link": "link-from"
        },
        {
          "value": "to",
          "text": "Система 2",
          "sortable": true,
          "align": "left",
          "width": "20%",
          "link": "link-to"
        },
        {
          "value": "direction",
          "text": "Связь",
          "sortable": true,
          "align": "center",
          "width": "5%"
        },
        {
          "value": "title",
          "text": "Описание",
          "sortable": true,
          "align": "left"
        },
        {
          "value": "contract",
          "text": "Контракт",
          "sortable": true,
          "align": "left",
          "link": "link-contract"
        }
      ],
      "source": "(\n    $[from=\"VUEX\" or to=\"VUEX\"]\n)\n",
      "$prototype": "dochub.table.select",
      "origin": "dochub.integrations"
    },
    "dochub.rules": {
      "location": "DocHub/Руководство/Правила",
      "description": "Подсистема контроля",
      "type": "markdown",
      "source": "rules.md",
      "subjects": [
        "dochub"
      ]
    },
    "dochub.rules.validators": {
      "location": "DocHub/Руководство/Правила/Валидаторы",
      "description": "Валидаторы",
      "type": "markdown",
      "source": "validators.md",
      "subjects": [
        "dochub"
      ]
    },
    "dochub.rules.exceptions": {
      "location": "DocHub/Руководство/Правила/Исключения",
      "description": "Исключения",
      "type": "markdown",
      "source": "exceptions.md",
      "subjects": [
        "dochub"
      ]
    },
    "dochub.standards.examples.expert": {
      "description": "Пример стандарта",
      "type": "markdown",
      "source": "standard.md"
    },
    "dochub.exceptions.examples.doc_markdown": {
      "description": "Пример основания для исключения",
      "type": "markdown",
      "source": "exreason.md"
    },
    "dochub.plugins.intro": {
      "location": "DocHub/Руководство/Плагины",
      "type": "markdown",
      "source": "introduction.md"
    },
    "dochub.plugins.interface": {
      "location": "DocHub/Руководство/Плагины/Интерфейсы ядра",
      "type": "markdown",
      "source": "interface.md"
    },
    "dochub.plugins.example": {
      "location": "DocHub/Руководство/Плагины/Пример",
      "type": "html",
      "headers": {
        "head1": {
          "type": "test"
        }
      },
      "source": "examples/example.html"
    }
  },
  "datasets": {
    "dochub.docs": {
      "source": "(\n  [docs.$spread().{\n    \"location\": *.location,\n    \"link\": \"/docs/\" & $keys()[0]\n  }[location]^(location)]\n)\n"
    },
    "dochub.components.criticality": {
      "source": [
        {
          "id": "k1",
          "title": "Уровень K1"
        },
        {
          "id": "k2",
          "title": "Уровень K2"
        },
        {
          "id": "k3",
          "title": "Уровень K3"
        },
        {
          "id": "k4",
          "title": "Уровень K4"
        }
      ]
    },
    "dochub.components": {
      "source": "(\n  [components.$spread().{\n      \"id\": $keys()[0],\n      \"location\": *.title,\n      \"link\": \"/architect/components/\" & $keys()[0]\n  }[$substring(id, 0, 7)=\"dochub.\"]^(title)]\n)\n"
    },
    "dochub.components.l1": {
      "origin": "dochub.components",
      "source": "($[$count($split(id, \".\"))=2])\n"
    },
    "dochub.integrations": {
      "source": "(\n  $MANIFEST := $;\n  $distinct([components.$spread().(\n      $COMPONENT := $;\n      $COMPONENT_ID := $keys()[0];\n      $.*.links.{\n          \"from\": $COMPONENT.*.title,\n          \"link-from\": \"/architect/components/\" & $COMPONENT_ID,\n          \"to\": id ? $lookup($MANIFEST.components, id).title : id,\n          \"link-to\": \"/architect/components/\" & id,\n          \"contract\": contract ? $lookup($MANIFEST.docs, contract).location : contract,\n          \"link-contract\": \"/docs/\" & contract,\n          \"title\": title,\n          \"direction\": direction\n      };\n  )])^(from)\n)\n"
    },
    "dochub.plugins.example": {
      "origin": "dochub.components",
      "source": "examples/test.jsonata"
    }
  },
  "components": {
    "dochub": {
      "title": "DocHub"
    },
    "dochub.front": {
      "title": "DocHub",
      "entity": "component",
      "source": "./",
      "expert": "R.Piontik",
      "technologies": [
        "JavaScript",
        "VUEJS2",
        "Chrome",
        "Firefox",
        "Safari"
      ],
      "aspects": [
        "dochub.gitlab.auth",
        "dochub.manifest.parsing",
        "dochub.contexts",
        "dochub.aspects",
        "dochub.docs",
        "dochub.radar",
        "dochub.navigation",
        "dochub.dataset"
      ],
      "links": [
        {
          "id": "dochub.gitlab",
          "direction": "<--",
          "title": "Манифесты и документы"
        },
        {
          "id": "dochub.plantuml",
          "direction": "-->",
          "title": "PlantUML"
        },
        {
          "id": "dochub.plantuml",
          "direction": "<-",
          "title": "Схема SVG"
        },
        {
          "id": "dochub.web",
          "direction": "<--",
          "title": "Манифесты и документы"
        }
      ]
    },
    "dochub.front.spa": {
      "title": "SPA приложение DocHub",
      "entity": "component",
      "source": "./src/frontend/main.js",
      "technologies": [
        "JavaScript",
        "VUEJS2",
        "Chrome",
        "Firefox",
        "Safari"
      ],
      "aspects": [
        "dochub.gitlab.auth",
        "dochub.manifest.parsing",
        "dochub.contexts",
        "dochub.aspects",
        "dochub.docs",
        "dochub.navigation",
        "dochub.radar",
        "dochub.dataset"
      ],
      "links": [
        {
          "id": "dochub.browser.localstorage",
          "title": "Кэш манифестов, cookies",
          "direction": "<-->"
        },
        {
          "id": "dochub.gitlab.api",
          "direction": "<--",
          "title": "Манифесты, документы"
        },
        {
          "id": "dochub.gitlab.oauth",
          "direction": "-->",
          "title": "Авторизация GitLab"
        },
        {
          "id": "dochub.gitlab.oauth",
          "direction": "<--",
          "title": "Токен авторизации"
        },
        {
          "id": "dochub.web",
          "direction": "<---",
          "title": "Манифесты, документы"
        },
        {
          "id": "dochub.plantuml.jar",
          "direction": "->",
          "title": "PlantUML"
        },
        {
          "id": "dochub.plantuml.jar",
          "direction": "<-",
          "title": "SVG"
        }
      ]
    },
    "dochub.front.spa.user_interface": {
      "title": "Интерфейс пользователя",
      "entity": "actor",
      "source": "./src/components/Root.vue",
      "technologies": [
        "JavaScript",
        "VUE2"
      ],
      "links": [
        {
          "id": "dochub.front.spa.router",
          "direction": "<-->"
        }
      ]
    },
    "dochub.front.spa.vue2": {
      "title": "VUE2",
      "entity": "component",
      "source": "./src/frontend/main.js",
      "technologies": [
        "JavaScript",
        "VUE2"
      ]
    },
    "dochub.front.spa.router": {
      "title": "VUE Router",
      "entity": "component",
      "source": "./src/router/index.js",
      "links": [
        {
          "id": "dochub.front.spa.vue2"
        }
      ]
    },
    "dochub.front.spa.vuex": {
      "title": "VUEX",
      "entity": "component",
      "source": "./src/storage/gitlab.js",
      "technologies": [
        "JavaScript",
        "VUE2",
        "VUEX"
      ]
    },
    "dochub.front.spa.menu": {
      "title": "DocHub меню",
      "entity": "component",
      "source": "./src/components/Menu.vue",
      "technologies": [
        "JavaScript",
        "VUE2"
      ],
      "links": [
        {
          "id": "dochub.front.spa.router",
          "title": "Представление",
          "direction": "-->"
        },
        {
          "id": "dochub.front.spa.jsonata",
          "title": "Меню",
          "direction": "<--"
        }
      ]
    },
    "dochub.front.spa.workspace": {
      "title": "Рабочая область",
      "entity": "component",
      "source": "./src/router/index.js",
      "technologies": [
        "JavaScript",
        "VUE2"
      ],
      "links": [
        {
          "id": "dochub.front.spa.router",
          "title": "Представление",
          "direction": "-->"
        }
      ]
    },
    "dochub.front.spa.jsonata": {
      "title": "JSONata",
      "entity": "component",
      "source": "./src/manifest/query.js",
      "technologies": [
        "JavaScript",
        "VUE2"
      ],
      "links": [
        {
          "id": "dochub.front.spa.vuex",
          "title": "Комплексный манифест",
          "direction": "<--"
        }
      ]
    },
    "dochub.front.spa.manifest_parser": {
      "title": "Manifest parser",
      "entity": "component",
      "source": "./src/manifest/manifest_parser.js",
      "technologies": [
        "JavaScript",
        "VUE2",
        "Axios"
      ],
      "links": [
        {
          "id": "dochub.front.spa.vuex",
          "title": "Комплексный манифест",
          "direction": "-->"
        },
        {
          "id": "dochub.front.spa.manifest_data",
          "direction": "<--"
        }
      ]
    },
    "dochub.front.spa.manifest_data": {
      "title": "Данные манифеста",
      "entity": "interface",
      "technologies": [
        "Axios"
      ]
    },
    "dochub.front.spa.blank": {
      "title": "Карточка объекта",
      "entity": "component",
      "source": "./src/Architecture/*",
      "technologies": [
        "JavaScript",
        "VUE2"
      ],
      "links": [
        {
          "id": "dochub.front.spa.workspace",
          "title": "Представление",
          "direction": "-->"
        },
        {
          "id": "dochub.front.spa.jsonata",
          "title": "Сводка, размещение и т.п.",
          "direction": "<--"
        },
        {
          "id": "dochub.front.spa.dataset",
          "title": "Данные",
          "direction": "<--"
        }
      ]
    },
    "dochub.front.spa.blank.radar": {
      "title": "Тех. радар",
      "entity": "component",
      "source": "./src/Techradar/*",
      "technologies": [
        "JavaScript",
        "VUE2"
      ]
    },
    "dochub.front.spa.blank.aspect": {
      "title": "Карточка аспекта",
      "entity": "component",
      "source": "./src/Architecture/Aspect.vue",
      "technologies": [
        "JavaScript",
        "VUE2"
      ]
    },
    "dochub.front.spa.blank.component": {
      "title": "Карточка компонента",
      "entity": "component",
      "source": "./src/Architecture/Component.vue",
      "technologies": [
        "JavaScript",
        "VUE2"
      ]
    },
    "dochub.front.spa.blank.context": {
      "title": "Карточка контекста",
      "entity": "component",
      "source": "./src/Architecture/Context.vue",
      "technologies": [
        "JavaScript",
        "VUE2"
      ]
    },
    "dochub.front.spa.blank.doc": {
      "title": "Карточка документа",
      "entity": "component",
      "source": "./src/Docs/*",
      "technologies": [
        "JavaScript",
        "VUE2"
      ]
    },
    "dochub.front.spa.blank.doc.markdown": {
      "title": "Markdown",
      "entity": "component",
      "technologies": [
        "JavaScript",
        "VUE2",
        "Markdown"
      ]
    },
    "dochub.front.spa.blank.doc.asyncapi": {
      "title": "AsyncApi",
      "entity": "component",
      "source": "./src/Docs/DocAsyncApi.vue",
      "technologies": [
        "JavaScript",
        "VUE2",
        "Markdown"
      ]
    },
    "dochub.front.spa.blank.doc.swagger": {
      "title": "Swagger",
      "entity": "component",
      "source": "./src/Docs/DocSwagger.vue",
      "technologies": [
        "JavaScript",
        "VUE2",
        "Markdown"
      ]
    },
    "dochub.front.spa.blank.doc.table": {
      "title": "Таблицы",
      "entity": "component",
      "source": "./src/Docs/DocTable.vue",
      "technologies": [
        "JavaScript",
        "VUE2"
      ]
    },
    "dochub.front.spa.dataset": {
      "title": "Источники данных",
      "entity": "component",
      "source": "./src/helpers/datasets.js",
      "technologies": [
        "JavaScript",
        "VUE2",
        "JSONata"
      ],
      "links": [
        {
          "id": "dochub.front.spa.vuex",
          "title": "Данные"
        },
        {
          "id": "dochub.front.spa.dataset_http",
          "title": "Данные",
          "direction": "<-"
        }
      ]
    },
    "dochub.front.spa.dataset_http": {
      "title": "Внешние данные",
      "entity": "interface",
      "technologies": [
        "Axios"
      ]
    },
    "dochub.plantuml": {
      "title": "PlantUML render server",
      "entity": "component",
      "expert": "R.Piontik",
      "technologies": [
        "PluntUML"
      ],
      "aspects": [
        "dochub.umlrender"
      ]
    },
    "dochub.plantuml.jar": {
      "title": "plantuml.jar",
      "entity": "component",
      "technologies": [
        "PluntUML"
      ],
      "aspects": [
        "dochub.umlrender"
      ],
      "links": [
        {
          "id": "dochub.plantuml.dot",
          "direction": "<-->"
        }
      ]
    },
    "dochub.plantuml.dot": {
      "title": "Graphviz",
      "entity": "component",
      "technologies": [
        "graphviz"
      ]
    },
    "dochub.user": {
      "title": "Пользователь",
      "entity": "actor",
      "links": [
        {
          "id": "dochub.front",
          "direction": "<--",
          "title": "Просмотр"
        }
      ]
    },
    "dochub.gitlab": {
      "title": "GitLab",
      "entity": "component",
      "expert": "R.Piontik",
      "technologies": [
        "GitLab"
      ],
      "aspects": [
        "dochub.gitlab.auth",
        "dochub.manifest.storage"
      ],
      "links": [
        {
          "id": "dochub.user",
          "direction": "<--",
          "title": "Развитие архитектуры"
        }
      ]
    },
    "dochub.gitlab.api": {
      "title": "GitLab API",
      "entity": "component",
      "technologies": [
        "GitLab"
      ],
      "links": [
        {
          "id": "dochub.gitlab.repository",
          "direction": "<--",
          "title": "Файлы манифестов, документы"
        }
      ]
    },
    "dochub.gitlab.repository": {
      "title": "Репозиторий",
      "entity": "database",
      "aspects": [
        "dochub.manifest.storage"
      ]
    },
    "dochub.gitlab.oauth": {
      "title": "GitLab Авторизация",
      "entity": "component",
      "aspects": [
        "dochub.gitlab.auth"
      ],
      "technologies": [
        "GitLab"
      ]
    },
    "dochub.gitlab.gitclient": {
      "title": "git client",
      "entity": "component",
      "technologies": [
        "Git"
      ],
      "aspects": [
        "dochub.git.client"
      ],
      "links": [
        {
          "id": "dochub.gitlab.api",
          "direction": "<-l->",
          "title": "Развитие"
        }
      ]
    },
    "dochub.browser": {
      "title": "Браузер",
      "entity": "component",
      "technologies": [
        "Chrome",
        "Firefox",
        "Safari"
      ]
    },
    "dochub.browser.localstorage": {
      "title": "LocalStorage",
      "entity": "database",
      "technologies": [
        "Chrome",
        "Firefox",
        "Safari"
      ],
      "aspects": [
        "dochub.manifest.storage"
      ]
    },
    "dochub.web": {
      "title": "WEB",
      "entity": "component",
      "expert": "R.Piontik",
      "technologies": [
        "HTTP"
      ],
      "aspects": [
        "dochub.manifest.storage"
      ]
    },
    "dochub.examples": {
      "title": "Примеры"
    },
    "dochub.examples.orders": {
      "title": "Сервис управления заказами",
      "entity": "component",
      "technologies": [
        "PHP"
      ],
      "asyncapi": {
        "servers": {
          "orders": {
            "url": "mqtt://order.host.net",
            "protocol": "mqtt",
            "description": "Orders gateway"
          }
        },
        "channels": {
          "order/create": {
            "subscribe": {
              "operationId": "emitOrderCreate",
              "message": {
                "$ref": "#/components/messages/OrderCreate"
              }
            }
          }
        },
        "components": {
          "messages": {
            "OrderCreate": {
              "name": "orderCreate",
              "title": "Создание заказа",
              "contentType": "application/json",
              "payload": {
                "$ref": "#/components/schemas/order"
              }
            }
          },
          "schemas": {
            "order": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "customer": {
                  "type": "string",
                  "format": "uuid"
                },
                "curr": {
                  "type": "string",
                  "description": "Валюта"
                },
                "value": {
                  "type": "number",
                  "description": "Сумма"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Момент создания"
                }
              }
            }
          }
        }
      },
      "openapi": {
        "paths": {
          "/orders": {
            "get": {
              "summary": "Получение списка заказов",
              "responses": {
                "200": {
                  "content": {
                    "application/json": {
                      "schema": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "format": "uid"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "dochub.examples.payment": {
      "title": "Сервис оплаты",
      "entity": "component",
      "expert": "R.Piontik",
      "technologies": [
        "SberPay",
        "Go"
      ],
      "asyncapi": {
        "servers": {
          "payments": {
            "url": "mqtt://pay.host.net",
            "protocol": "mqtt",
            "description": "Payment gateway"
          }
        },
        "channels": {
          "pay/payment": {
            "subscribe": {
              "operationId": "emitPayment",
              "message": {
                "$ref": "#/components/messages/Payment"
              }
            }
          }
        },
        "components": {
          "messages": {
            "Payment": {
              "name": "payment",
              "title": "Оплата",
              "summary": "Сообщение по оплате",
              "contentType": "application/json",
              "payload": {
                "$ref": "#/components/schemas/payment"
              }
            }
          },
          "schemas": {
            "payment": {
              "type": "object",
              "properties": {
                "account": {
                  "type": "string",
                  "description": "Номер счета"
                },
                "curr": {
                  "type": "string",
                  "description": "Валюта"
                },
                "value": {
                  "type": "number",
                  "description": "Сумма"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Момент создания"
                }
              }
            }
          }
        }
      },
      "openapi": {
        "paths": {
          "/payments": {
            "get": {
              "summary": "Получение списка счетов",
              "responses": {
                "200": {
                  "content": {
                    "application/json": {
                      "schema": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "format": "uid"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "contexts": {
    "dochub.example": {
      "title": "Контектс-пример",
      "components": [
        "dochub.examples.orders",
        "dochub.examples.payment"
      ]
    },
    "dochub": {
      "title": "Общая архитектура DocHub",
      "location": "DocHub",
      "components": [
        "dochub.front",
        "dochub.user",
        "dochub.plantuml",
        "dochub.gitlab",
        "dochub.web"
      ]
    },
    "dochub.front": {
      "title": "Контейнерная архитектура DocHub",
      "location": "DocHub/Контейнерная архитектура",
      "components": [
        "dochub.browser.*",
        "dochub.front.*",
        "dochub.gitlab.*",
        "dochub.plantuml.*",
        "dochub.web"
      ]
    },
    "dochub.front.spa": {
      "title": "Компонентная архитектура DocHub",
      "location": "DocHub/Компонентная архитектура",
      "components": [
        "dochub.front.spa.*"
      ]
    },
    "dochub.custom": {
      "title": "Компоненты эксперта R.Piontik",
      "location": "DocHub/Контекст по источнику",
      "extra-links": false,
      "source": "(               \n    $ ~> | $ | {\n        \"components\": $merge(components.$spread().(\n            $.*.expert = 'R.Piontik' ? $ : {}\n        )) \n    } |\n)\n",
      "components": [
        "dochub.*"
      ]
    },
    "dochub.front.spa.blank": {
      "title": "Карточка объекта",
      "components": [
        "dochub.front.spa.blank.*"
      ]
    },
    "dochub.front.spa.blank.doc": {
      "title": "Документ",
      "components": [
        "dochub.front.spa.blank.doc.*"
      ]
    },
    "dochub.sequence": {
      "title": "Диаграмма взаимодействия DocHub",
      "icon": "settings_ethernet",
      "location": "DocHub/Диаграмма взаимодействия",
      "uml": "../docs/sequence.puml"
    }
  },
  "aspects": {
    "dochub": {
      "title": "DocHub",
      "location": "DocHub",
      "prodact": "Буренин Ольгерт Юрьевич",
      "analyst": "Семенов Руслан Вазгенович",
      "curator": "Кучменко Татьяна Вадимовна"
    },
    "dochub.git": {
      "title": "Git",
      "location": "DocHub/Git"
    },
    "dochub.git.test.pest.kwest": {
      "title": "Git",
      "location": "DocHub/Git"
    },
    "dochub.git.client": {
      "title": "Развитие репы",
      "location": "DocHub/GitLab/Git-клиент"
    },
    "dochub.gitlab": {
      "title": "GitLab",
      "location": "DocHub/GitLab"
    },
    "dochub.gitlab.auth": {
      "title": "Авторизация GitLab",
      "location": "DocHub/GitLab/Авторизация"
    },
    "dochub.umlrender": {
      "title": "Рендеринг PlantUML",
      "location": "DocHub/Рендеринг/PlantUML"
    },
    "dochub.contexts": {
      "title": "Рендеринг контекстов",
      "location": "DocHub/Рендеринг/Контексты"
    },
    "dochub.aspects": {
      "title": "Рендеринг аспектов",
      "location": "DocHub/Рендеринг/Аспекты"
    },
    "dochub.docs": {
      "title": "Рендеринг документов",
      "location": "DocHub/Рендеринг/Документы"
    },
    "dochub.navigation": {
      "title": "Навигация по архитектуре",
      "location": "DocHub/Навигация по архитектуре"
    },
    "dochub.radar": {
      "title": "Технологический радар",
      "location": "DocHub/Технологический радар"
    },
    "dochub.cache": {
      "title": "Кэш данных",
      "location": "DocHub/Кэш"
    },
    "dochub.manifest": {
      "title": "Манифесты",
      "location": "DocHub/Манифесты"
    },
    "dochub.manifest.storage": {
      "title": "Хранилище манифестов",
      "location": "DocHub/Манифесты/Хранилище манифестов"
    },
    "dochub.manifest.parsing": {
      "title": "Парсинг манифестов",
      "location": "DocHub/Манифесты/Парсинг манифестов"
    },
    "dochub.dataset": {
      "title": "Источники данных",
      "location": "DocHub/Источники данных"
    }
  },
  "namespaces": {
    "dochub": {
      "title": "DocHub"
    },
    "gitlab": {
      "title": "GitLab"
    },
    "git": {
      "title": "Клиент git"
    },
    "manifest": {
      "title": "Манифесты"
    },
    "plantuml": {
      "title": "PlantUML сервер"
    },
    "web": {
      "title": "WEB-ресурсы"
    }
  },
  "forms": [
    {
      "entity": [
        "component"
      ],
      "fields": {
        "source": {
          "title": "Файл",
          "required": true
        }
      }
    }
  ],
  "technologies": {
    "sections": {
      "language": {
        "title": "Языки программирования"
      },
      "parsers": {
        "title": "Парсеры"
      },
      "tools": {
        "title": "Инструментарий"
      },
      "storages": {
        "title": "Хранилища"
      },
      "browsers": {
        "title": "Браузеры"
      }
    },
    "items": {
      "JavaScript": {
        "aliases": [
          "js",
          "NodeJS"
        ],
        "title": "Супер-крутой язык программирования",
        "link": "https://ru.wikipedia.org/wiki/JavaScript",
        "section": "language",
        "status": "adopt"
      },
      "Chrome": {
        "aliases": [
          "Firefox",
          "Safari"
        ],
        "section": "browsers",
        "status": "adopt"
      },
      "VUEJS2": {
        "aliases": [
          "VUE",
          "VUE2"
        ],
        "section": "tools",
        "status": "adopt"
      },
      "VUEX": {
        "section": "tools",
        "status": "adopt"
      },
      "Axios": {
        "section": "tools",
        "status": "adopt"
      },
      "Git": {
        "section": "tools",
        "status": "adopt"
      },
      "Markdown": {
        "section": "parsers",
        "status": "adopt"
      },
      "Swagger": {
        "section": "parsers",
        "status": "adopt"
      },
      "PluntUML": {
        "section": "parsers",
        "status": "adopt"
      },
      "GitLab": {
        "section": "storages",
        "status": "adopt"
      },
      "HTTP": {
        "section": "storages",
        "status": "adopt"
      }
    }
  },
  "interactions": {
    "dochub": {
      "title": "DocHub"
    },
    "dochub.user": {
      "title": "Взаимодействия с пользователем",
      "triggers": [
        "Просмотр архитектуры"
      ],
      "steps": [
        {
          "from": "User",
          "to": "DocHub",
          "value": "Вход на портал"
        },
        {
          "from": "DocHub",
          "to": "User",
          "value": "Представление архитектурных артефактов"
        }
      ],
      "results": [
        "Информация о существующей архитектуре"
      ]
    },
    "dochub.user.check": {
      "title": "Прверка отклонений выявленных валидаторами",
      "triggers": [
        "Просмотр архитектуры"
      ],
      "steps": [
        {
          "from": "User",
          "to": "DocHub",
          "value": "Выбор раздела Проблемы"
        },
        {
          "from": "DocHub",
          "to": "User",
          "value": "Генерация дерева со статусами"
        },
        {
          "from": "User",
          "to": "DocHub",
          "value": "Выбор отклонения"
        },
        {
          "from": "DocHub",
          "to": "User",
          "value": "Карточка отклонения"
        }
      ],
      "results": [
        "Информация об отклонениях"
      ]
    },
    "dochub.user.research": {
      "title": "Изучение документации",
      "triggers": [
        "Просмотр документов"
      ],
      "steps": [
        {
          "from": "User",
          "to": "DocHub",
          "value": "Выбор раздела Документы"
        },
        {
          "from": "DocHub",
          "to": "User",
          "value": "Представление"
        }
      ],
      "results": [
        "Актуальная информация из документов"
      ]
    }
  }
}
